package model;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

import ar.edu.utn.frba.dds.aterrizar.aerolineas.AerolineaLanchitaAdapter;
import ar.edu.utn.frba.dds.aterrizar.aerolineas.AerolineaOceanicAdapter;
import ar.edu.utn.frba.dds.aterrizar.aerolineas.OperadorDeAerolineas;
import ar.edu.utn.frba.dds.aterrizar.busquedas.Busqueda;
import ar.edu.utn.frba.dds.aterrizar.busquedas.CondicionesExtra;
import ar.edu.utn.frba.dds.aterrizar.busquedas.CondicionesExtraBuilder;
import ar.edu.utn.frba.dds.aterrizar.busquedas.RangoFechas;
import ar.edu.utn.frba.dds.aterrizar.busquedas.Vuelo;
import ar.edu.utn.frba.dds.aterrizar.domain.fechas.ConversorDeFormato;
import ar.edu.utn.frba.dds.aterrizar.domain.fechas.Latinoamericano;
import ar.edu.utn.frba.dds.aterrizar.mocks.MockAerolineaLanchitaOriginal;
import ar.edu.utn.frba.dds.aterrizar.usuarios.HomeUsuarios;
import ar.edu.utn.frba.dds.aterrizar.usuarios.Usuario;

@Observable
public class BuscarAsientosModel {
	
	private Usuario usuario;
	private String nombreDeUsuario;
	private List<Vuelo> resultados;
	private String origen;
	private String destino;
	private String fechaSalida;
	private Vuelo vueloSeleccionado;
	private Set<String> origenes = new HashSet<String>();
	private Set<String> destinos = new HashSet<String>();
	private Boolean incluirReservados;
	private String ubicacion;
	private ArrayList<String> ubicaciones = new ArrayList<String>();
	private Boolean claseEjecutiva;
	private Boolean claseTurista;
	private Boolean clasePrimera;
	
	public BuscarAsientosModel(String usuario) {
		Usuario usuarioModelo = HomeUsuarios.getInstance().buscarUsuario(usuario);
		this.setUsuario(usuarioModelo);
		OperadorDeAerolineas.createInstance();
		OperadorDeAerolineas operador = OperadorDeAerolineas.getInstance();
		operador.agregarAerolinea(new AerolineaLanchitaAdapter(new MockAerolineaLanchitaOriginal()));
		operador.agregarAerolinea(AerolineaOceanicAdapter.getInstance());
		setOrigenes(operador.getOrigenes());
		setDestinos(operador.getDestinos());
		ArrayList<String> ubicaciones = new ArrayList<String>();
		ubicaciones.add("V");
		ubicaciones.add("P");
		ubicaciones.add("C");
		setUbicaciones(ubicaciones);
	}

	public void search() {
		if(origen == null || destino == null || fechaSalida == null) throw new UserException("Debe ingresar origen, destino y fecha");
		CondicionesExtraBuilder condicionesExtraBuilder = new CondicionesExtraBuilder();
		if(claseTurista) condicionesExtraBuilder.addClase("T");
		if(claseEjecutiva) condicionesExtraBuilder.addClase("E");
		if(clasePrimera) condicionesExtraBuilder.addClase("P");
		if(ubicacion != null) condicionesExtraBuilder.addUbicacion(ubicacion);
		CondicionesExtra condicionesExtra = condicionesExtraBuilder.build();
		Busqueda busqueda = new Busqueda(origen, destino, new RangoFechas(fechaSalida, null, null, null), condicionesExtra);
		if(incluirReservados) busqueda.setIncluirReservados();
		this.resultados = this.usuario.buscarVuelos(busqueda);
	}
	
	public void reservarVuelo() {
		usuario.reservarVuelo(vueloSeleccionado);
	}
	
	public void comprarVuelo() {
		usuario.comprarVuelo(vueloSeleccionado);
	}
	
	public void verTodosLosVuelos() {
		clear();
		this.resultados = OperadorDeAerolineas.getInstance().getTodosLosVuelos();
	}
	
	public void clear() {
		this.origen = null;
		this.destino = null;
		this.fechaSalida = null;
		this.incluirReservados = false;
		this.clasePrimera = false;
		this.claseEjecutiva = false;
		this.claseTurista = false;
		this.ubicacion = null;
		this.resultados = null;
	}
	
	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
		setNombreDeUsuario();
	}

	public String getNombreDeUsuario() {
		return nombreDeUsuario;
	}

	public void setNombreDeUsuario() {
		this.nombreDeUsuario = usuario.getNombre() + " " + usuario.getApellido();
	}
	
	public List<Vuelo> getResultados() {
		return resultados;
	}

	public void setResultados(List<Vuelo> resultados) {
		this.resultados = resultados;
	}

	public String getOrigen() {
		return origen;
	}

	public void setOrigen(String origen) {
		this.origen = origen;
	}

	public String getDestino() {
		return destino;
	}

	public void setDestino(String destino) {
		this.destino = destino;
	}

	public String getFechaSalida() {
		return fechaSalida;
	}

	public void setFechaSalida(String fechaSalida) {
		this.fechaSalida = fechaSalida;
		try {
			ConversorDeFormato conversor = new ConversorDeFormato();
			conversor.agregarFormato(new Latinoamericano());
			conversor.convertirFecha(fechaSalida);
		} catch (RuntimeException e) {
			throw new UserException("Fecha invalida. Pruebe con 20/12/2012");
		}
	}

	public Vuelo getVueloSeleccionado() {
		return vueloSeleccionado;
	}

	public void setVueloSeleccionado(Vuelo vueloSeleccionado) {
		this.vueloSeleccionado = vueloSeleccionado;
	}

	public Set<String> getOrigenes() {
		return origenes;
	}

	public void setOrigenes(Set<String> origenes) {
		this.origenes = origenes;
	}

	public Set<String> getDestinos() {
		return destinos;
	}

	public void setDestinos(Set<String> destinos) {
		this.destinos = destinos;
	}

	public Boolean getIncluirReservados() {
		return incluirReservados;
	}

	public void setIncluirReservados(Boolean incluirReservados) {
		this.incluirReservados = incluirReservados;
	}

	public ArrayList<String> getUbicaciones() {
		return ubicaciones;
	}

	public void setUbicaciones(ArrayList<String> ubicaciones) {
		this.ubicaciones = ubicaciones;
	}

	public Boolean getClaseEjecutiva() {
		return claseEjecutiva;
	}

	public void setClaseEjecutiva(Boolean claseEjecutiva) {
		this.claseEjecutiva = claseEjecutiva;
	}

	public Boolean getClaseTurista() {
		return claseTurista;
	}

	public void setClaseTurista(Boolean claseTurista) {
		this.claseTurista = claseTurista;
	}

	public Boolean getClasePrimera() {
		return clasePrimera;
	}

	public void setClasePrimera(Boolean clasePrimera) {
		this.clasePrimera = clasePrimera;
	}

	public String getUbicacion() {
		return ubicacion;
	}

	public void setUbicacion(String ubicacion) {
		this.ubicacion = ubicacion;
	}

}
